<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>旋转数组</title>
  </head>
  <body></body>
  <script>
    // 今天给大家讲一个旋转数组
    // 定一个数组，旋转数组就是将数组中的元素向右移动 k 个位置，其中 k 不可以是负数
    // 输入:[1，2，3，4，5，6，7] 和 k = 3
    // 输出:[5，6， 7, 1，2，3，4]
    // 解释:
    // 向右旋转1步:[7， 1，2，3，4，5，6]
    // 向右旋转2步:[6， 7，1，2，3，4，5]
    // 向右旋转3步:[5，6，7，1，2，3，4]
    // 输入:[-1,-100，3，99] 和 k = 2
    // 输出:[3， 99,-1，-100]
    // 解释:
    // 向右旋转1步:[99，-1，-100，3]
    // 向右旋转2步:[3,99,-1,-100]

    function rotate(k) {
      // => k 的值必须大于 0 也不能等于 0 ,等于 0 的话数组的内容就不变
      if (k < 0 || k === 0 || k === arr.length) return this;
      // => 如果 k 的值大于数组的值, 就要用 k 的值除以 数组的内容,
      if (k > arr.length) k = k % arr.length;
      // 旋转数组

      // 方案一: slice 支持负数作为索引
      // 思路: 用slice方法拿到要移动的值,然后找到从 0 开始 arr.length 减去 k 的值
      // 最后用 concat 拼成一个新的移动后的数组
      // return arr.slice(-k).concat(arr.slice(0, this.length - k));

      // 方案二: 使用 splice 从索引开始删,删除的部分以新数组返回,然后拼接在数组前面
      // return [...arr.splice(this.length - k), ...arr];
      return arr.splice(this.length - k).concat(arr);

      // 方案三: 使用 for 循环 pop 出要移动的数字 最后让 unshift 添加在数组最前面
      // for (let i = 0; i < k; i++) {
      //   arr.unshift(arr.pop());
      // }
    }
    let arr = [1, 2, 3, 4, 5, 6, 7];
    // 旋转 arr 数组 传入移动的数值
    console.log(rotate(3), "数据旋转完之后");
    console.log(arr, "截取之后的数组");
  </script>
</html>
